package day4;

import day4.Person;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

public class TestMethod {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //1.获取类对象
        Class c=Class.forName("day4.Person");
        //2.获取方法
        Method[] ms=c.getDeclaredMethods();
        for(Method method:ms){
            String name=method.getName();
            Class[] cs=method.getParameterTypes();
            Class result=method.getReturnType();
            System.out.println("方法:"+name+",参数:"
                    + Arrays.toString(cs)+",返回:"+result);
        }
        //获取单个方法 然后进行调用
        //c.getDeclaredMethod(方法名，可变长的方法参数);
        //test();
        //test("aa");
        //test("a",10,false);
        Method m1=c.getDeclaredMethod("test1");
        Method m2=c.getDeclaredMethod("test2", String.class, Integer.class);
        Method m3=c.getDeclaredMethod("test3", int.class, int.class);
        m2.setAccessible(true);//开启私有权限
        //调用方法 m1.invoke(对象，方法调用的实参)
        Person p=new Person(10);
        Object value1=m1.invoke(p);
        Object value2=m2.invoke(p,"姓名",18);
        Object value3=m3.invoke(p,10,20);
        System.out.println(value1+" "+value2+" "+value3);
    }
    //如果方法的参数个数不确定 或者类型也不确定 可以定义成Object
    //String ... a 表示可变长参数(本质上就是数组)
    public static void test(Object ... a){
        for(int i=0;i<a.length;i++){
            System.out.println(a[i]);
        }
    }

}

